﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
////数组传参的本质
//void test(int arr[])
//{
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	printf("%d ", sz);
//}
////数组传参传的不是整个数组，而是首元素的地址
//int main()
//{
//	int arr[10] = { 0 };
//	test(arr);//这里的数组名是首元素的地址
//	return 0;
//}

//冒泡排序
//写一个函数，对一个整数数组的数据进行排序
//思想：相邻两个元素比较，不满足顺序就交换
//例如有一个降序数列：
//9 8 7 6 5 4 3 2 1 0    未比较
//8 9 7 6 5 4 3 2 1 0    8与9比较，9后移
//…… 以此类推，9分别与7、 6 ……1、 0 比较
//8 7 6 5 4 3 2 1 0 9   第一轮结束
//7 8 6 5 4 3 2 1 0 9  7与8比较，8后移
//……以此类推，直到排为升序~

//#include<stdio.h>
//
//int count = 0;
//void BubbleSort(int arr[], int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz - 1; i++)
//	{
//		int flag = 1;//假设排好了
//		//一轮冒泡排序的过程
//		int j = 0;
//		for (j = 0; j < sz - 1 - i; j++)
//		{
//			count++;//用于计算排了几次
//			//一对数字比较
//			if (arr[j] > arr[j + 1])//交换条件
//			{
//				//交换
//				int tmp = arr[j];
//				arr[j] = arr[j + 1];
//				arr[j + 1] = tmp;
//				flag = 0;
//			}
//		}
//		if (flag == 1)
//		{
//			break;
//		}
//	}
//}
//int main()
//{
//	int arr[10] = { 9,0,1,2,3,4,5,6,7,8};
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	BubbleSort(arr, sz);
//	for (int i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	printf("count=%d", count);
//}


//#include<stdio.h>
//
//int main()
//{
//	int a = 0;
//	int* p = &a;
//	int* * pp = &p;
//	return 0;
//}
//利用指针数组模拟实现二维数组
//#include<stdio.h>
//
//int main()
//{
//	int arr1[] = { 1,2,3,4,5 };
//	int arr2[] = { 2,3,4,5,6 };
//	int arr3[] = { 3,4,5,6,7 };
//	int* arr[] = { arr1,arr2,arr3 };
//	//打印
//	for (int i = 0; i < 3; i++)
//	{
//		for (int j = 0; j < 5; j++)
//		{
//			printf("%d ", arr[i][j]);
//		}
//		printf("\n");
//	}
//	return 0;
//}


//#include<stdio.h>
//
//int main()
//{
//	const char* p = "abcdef";//不是把字符串abcdef\0存放在p中，而是把第一个字符的地址存放在p中
//	printf("%c", *p);
//	return 0;
//	p[3] = 'q';
//}

//《剑指offer》中收录了⼀道和字符串相关的笔试题，我们⼀起来学习⼀下：
//#include <stdio.h>
//int main()
//{
//	char str1[] = "hello bit.";
//	char str2[] = "hello bit.";
//	const char* str3 = "hello bit.";
//	const char* str4 = "hello bit.";
//	if (str1 == str2)
//		printf("str1 and str2 are same\n");
//	else
//		printf("str1 and str2 are not same\n");
//
//	if (str3 == str4)
//		printf("str3 and str4 are same\n");
//	else
//		printf("str3 and str4 are not same\n");
//
//	return 0;
//}

//#include<stdio.h>
//
//void Print(int(*arr)[5], int r, int c)
//{
//	for (int i = 0; i < r; i++)
//	{
//		for (int j = 0; j < c; j++)
//		{
//			printf("%d ", *(*(arr + i) + j));
//		}
//		printf("\n");
//	}
//}
//int main()
//{
//
//	int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
//	Print(arr, 3, 5);
//	return 0;
//}

#include<stdio.h>
//int Add(int x, int y)
//{
//	return x + y;
//}
//int main()
//{
//	int(*pf)(int, int) = &Add;
//	int ret1 = Add(4, 5);
//	printf("%d\n", ret1);
//
//	int ret2 = (*pf)(4, 5);
//	printf("%d\n", ret2);
//
//	int ret3 = pf(4, 5);
//	printf("%d\n", ret3);
//	return 0;
//}
//
//typedef 类型重命名
//可以将复杂的类型名字重命名
//typedef unsigned int uint;
//对于指针类型重命名
//typedef int* ptr_t;
//对于数组指针和函数指针类型重命名  有区别
//typedef int(*parr_t)[5];//parr_t是数组指针类型新的名字
//typedef void(*pf)(int);//pf是函数指针类型新的名字